# Kapitel 3: 
# Eigenfunktionen des Kragbalkens nach  Timoshenko
#  2017  Friedrich U. Mathiak, 
# mathiak@mechanik-info.de
# 
> restart: with(LinearAlgebra): unprotect(Zeta); Digits=15:
# Die ortsahngige Differenzialgleichung lautet:
> odeW:=diff(W(x),x$4)+kappa[B]^4*iy^2*(1+alpha)*diff(W(x),x$2)-kappa[B]^4*(1-kappa[B]^4*iy^4*alpha)*W(x);
# Diese gewhnliche Differenzialgleichung ist ein Folge des Separationsansatzes fr harmonische Schwingungen der Form  w(x,t) = W(x)sin(t + ) . Sie hat die Lsung:
> dsolve(odeW,W(x)): assign(%); simplify(W(x));
# Zur Verkrzung der Schreibweise fhren wir die Variable z ein:
> kappa[B]:=z/iy;
> simplify(map(eval,W(x)));
# Wir wandeln die Exponentialdarstellung noch etwas um und erhalten -jetzt mit neuen Konstanten- fr die ortsabhngige Verschiebung:
> W:=unapply(_C1*sin(lambda[1]*x)+_C2*cos(lambda[1]*x)+_C3*sinh(lambda[2]*x)+_C4*cosh(lambda[2]*x),x);
# Die Argumente 1 und 2 werden weiter unten eingefhrt. Die harmonische Schwingung selbst ist dann:
> w:= W(x)*sin(omega*t + phi);
# Mit w(x,t) = W(x)sin(t + ) ergibt sich die Ortsfunktion des Drehwinkels (x) aus der Differenzialgleichung ȴ = A/(GAS )  w  -  w zu
> PSI:=Zeta[1]*(_C1*cos(lambda[1]*x)-_C2*sin(lambda[1]*x))-Zeta[2]*(_C3*cosh(lambda[2]*x)+_C4*sinh(lambda[2]*x));
> PSIstr:=simplify(diff(PSI,x));
# Lsung des Randwertproblems: Am linken Balkenende mssen die Durchsenkungen W sowie der Drehwinkel   verschwinden. Am rechten freien Balkenende mssen Biegemoment und  Querkraft verschwinden. Das fhrt auf folgendes lineare homogene Gleichungssystem:
> gl1:=eval(subs(x=0,W(x)));
> gl2:=eval(subs(x=0,PSI));
> gl3:=eval(subs(x=l,diff(W(x),x) + PSI));
> gl4:=eval(subs(x=l,PSIstr));
> DA, b := GenerateMatrix([gl1,gl2,gl3,gl4],[_C1,_C2,_C3,_C4]);
> EWG:=simplify(Determinant(DA));
# oder fr die nummerische Abarbeitung besser geeignet:
> EWG:=cos(lambda[1]*l)+k1*sin(lambda[1]*l)*tanh(lambda[2]*l)+k2/cosh(lambda[2]*l);
> k1:=-Zeta[2]*Zeta[1]*((-Zeta[2]+2*lambda[2])*lambda[1]+Zeta[1]*lambda[2])/(((-Zeta[1]^2+Zeta[2]^2)*lambda[2]+Zeta[1]^2*Zeta[2])*lambda[1]+Zeta[1]*Zeta[2]^2*lambda[2]);
> k2:=-Zeta[2]*(Zeta[1]*lambda[1]+lambda[1]^2+lambda[2]*(Zeta[2]-lambda[2]))*Zeta[1]/(((-Zeta[1]^2+Zeta[2]^2)*lambda[2]+Zeta[1]^2*Zeta[2])*lambda[1]+Zeta[1]*Zeta[2]^2*lambda[2]);
# Berechnung der Integrationskonstanten. Da eine Konstante frei gewhlt werden kann, setzen wir 
> _C4:=1;
# Das verbleibende Gleichungssystem ist
> AR, b := GenerateMatrix([gl1,gl2,gl3],[_C1,_C2,_C3]);
> unb:=LinearSolve(AR,b);
> _C1:=simplify(unb[1]); _C2:=simplify(unb[2]); _C3:=simplify(unb[3]);
> lambda[1]:=sqrt(2)/2/iy*z*sqrt(sqrt(4+z^4*(alpha-1)^2)+(alpha+1)*z^2);
> lambda[2]:=sqrt(2)/2/iy*z*sqrt(sqrt(4+z^4*(alpha-1)^2)-(alpha+1)*z^2);
> Zeta[1]:=simplify((alpha*z^4/iy^2 - lambda[1]^2)/lambda[1]);
> Zeta[2]:=simplify((alpha*z^4/iy^2 + lambda[2]^2)/lambda[2]);
# Beispiel fr einen kurzen Stahlbetonbalken ( / h = 5)
> b:=0.2; h:=0.6; A:=b*h; Iyy:=b*h^3/12; iy:=sqrt(Iyy/A); l:=3.; 
> E:=3.05E10; G:=E/2; rho:=2500.; AS:=5/6*A; alpha:=E*A/(G*AS);
> zg:=1/alpha^(1/4); 
> EWG:=unapply(EWG,z): plot(EWG(z),z=0..zg,axes=boxed,gridlines);
# In der folgenden Schleife werden dieNullstellen der  Eigenfunktion EWG(z) berechnet. Dazu wird EWG(z)  im Intervall [a,b] mit der Schrittweite dz ausgewertet. Ist EWG(z)*EWG(z+dz)  < 0, dann hat die Eigenfunktion  in diesem Intervall einen Nulldurchgang. In diesem Fall wird die Nullstelle mit  fsolve  nummerisch konkretisiert.
> Z0:=[]: a:=0.: b:=zg: dz:=0.01: dmax:=round((b-a)/dz): za:= a: ze:=za+dz:
> for n to dmax do
>   if evalf(EWG(za)*EWG(ze)) < 0. then
>     Z0:=[op(Z0),fsolve(EWG(z),z=za..ze)]:
>   end if:
>   za:= ze; ze:=za+dz;
> end do: 
> nmax:=nops(Z0): f:=sqrt(E*A/rho/Iyy):
> ZN:=convert(Z0,Vector): OMEGA:=Vector(nmax): FR:=Vector(nmax):
> for n to nmax do
>   OMEGA[n]:=evalf(Z0[n]^2*f);
>   FR[n]   :=OMEGA[n]/2/Pi;
> end do:
> print(`  z = `,ZN,`   = `,OMEGA, `  f = `, FR);
# Wir stellen die Zustandsgren zum 1. Eigenwert grafisch dar:
> z:=ZN[1];
> QN:=diff(W(x),x)+PSI: MN:=l*PSIstr: Wstr:=diff(W(x),x):
> para:=x=0..l,gridlines=true,titlefont = ["ARIAL", 15],  labeldirections = ["horizontal", "vertical"], labelfont = ["HELVETICA", 10],axesfont = ["HELVETICA", "ROMAN", 8],axes=boxed:
> p1:= plot(QN  ,para,title = "\nNormierte Querkraft\n"   ,labels = ["x", "QN(x)"]):
> p2:= plot(MN  ,para,title = "\nNormiertes Biegemoment\n" ,labels = ["x", "MN(x)"]):
> p3:= plot(W(x),para,title = "\nVerschiebung\n",labels = ["x", "W(x)"]):
> p4:= plot(PSI ,para,title = "\nDrehwinkel\n"  ,labels = ["x", "(x)"]):
> plots[display](Matrix(1,4,[p1,p2,p3,p4]));
# In einer weiteren Grafik stellen wir abschlieend die ersten drei Durchsenkungs-Eigenfunktionen grafisch dar:
> WX:=[]: PSIX:=[]:
> for i to 3 do 
>   z   :=ZN[i];
>   WX  :=[op(WX),W(x)];
>   PSIX:=[op(PSIX),PSI];
> end do:
> plot(WX,x=0..l,gridlines=true,axes=boxed,title = "\nDurchsenkungs-Eigenfunktionen\n", legend = ["Grundschwingung", "1. Oberschwingung","2. Oberschwingung"], titlefont = ["ARIAL", 15],  linestyle = [solid, dot, dash], axesfont = ["HELVETICA", "ROMAN", 8], legendstyle = [font = ["HELVETICA", 9], location =bottom],color=[black,black,black]);
> plot(PSIX,x=0..l,gridlines=true,axes=boxed,title = "\nDrehwinkel-Eigenfunktionen\n", legend = ["Grundschwingung", "1. Oberschwingung","2. Oberschwingung"], titlefont = ["ARIAL", 15],  linestyle = [solid, dot, dash], axesfont = ["HELVETICA", "ROMAN", 8], legendstyle = [font = ["HELVETICA", 9], location =bottom],color=[black,black,black]);
> 
;
